home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / listings / v_12_02 / smith / crc16g.h < prev    next >
C/C++ Source or Header  |  1993-12-29  |  946b  |  42 lines

  1. /** CRC16G.C
  2.  * 
  3.  * Adapted from CRC-16F.C, a public domain routine
  4.  * in Bob Stout's Snippets file collection.
  5.  * Adaptations donated to public domain.
  6.  * 
  7.  * Call initcrctab() to initialize table.
  8.  */
  9. #include "crc16.h"
  10.  
  11. unsigned short crctab[1 << 8];
  12. static int  initialized = 0;
  13.  
  14. #define P 0x1021          /* CRC polynomial */
  15.  
  16. unsigned short
  17. updcrc(unsigned short crc,      /* prev CRC */
  18.        const unsigned char *cp, /* new data */
  19.        unsigned int cnt)        /* # bytes  */
  20. {                       
  21.    while (cnt--)
  22.       crc = UPDATE_CRC1(*cp++, crc);
  23.    return (crc & CRCMASK);
  24. }
  25.  
  26. void initcrctab(void) {
  27.    unsigned int b, v;
  28.    int         i;
  29.    if (initialized)
  30.       return;
  31.  
  32.    for (b = 0; b <= (1 << 8) - 1; ++b) {
  33.       for (v = b << (CRCW - 8), i = 8; --i >= 0;)
  34.          v = v & 0x8000 ? (v << 1) ^ P : v << 1;
  35.       crctab[b] = v;
  36.    }
  37.    initialized = 1;
  38. }
  39.  
  40. /* End of File */ 
  41.  
  42.